#include "shellCmdUser.h"
#include "unistd.h"
#include "virtual_pwm_user.h"
#include "user.h"

#ifdef AW_SHELL

//#include "globalVariate.h"

//extern int16_t temperature_pt100_1;
//extern int16_t temperature_pt100_2;
//extern int16_t vacuum_value;
//extern int16_t vacuum_current;

//extern uint16_t EEPROM_Data[EEPROM_NumbOfVar];
//extern uint16_t EEPROM_DefaultData[EEPROM_NumbOfVar];

//extern uint16_t Sensor_Data[SENSOR_DATA_NUM];

/*
 * Operation of DAC.
 * -c: channel, 0~1
 * -v: voltage, range from 0~2500, unit is mV
 * -s: state, 0 off, 1 on
 */
int shellCmd_SetDAC(uint32_t argc, const char *argv[])
{
	int opt = 0;
	optind = 0;
	optarg = 0;
	opterr = 0;
	optopt = 0;

	int dac_channel = 0;
	int dac_value = 0;
	int dac_state = 0;

	while ((opt = getopt((int)argc,(char * const *) argv, (const char *) "c:v:s:")) != -1)
	{
		switch (opt)
		{
		case 'c':
			dac_channel = atoi(optarg);
			if(dac_channel>1)
			{
				return -1;
			}
			break;
		case 'v':
			dac_value = atoi(optarg);
			if(dac_value>3300)
			{
				return -1;
			}
			break;
		case 's':
			dac_state = atoi(optarg);
			if(dac_state>1)
			{
				return -1;
			}
			break;
		default:
			return -1;
		}
	}

	int pwm_duty = dac_value*100/3300;
//	VirPwm_Init(&VirPwmDefArray[dac_channel], DAC_PWM_FREQ, pwm_duty, 0);
	VirPwm_SetDutyCycle(&VirPwmDefArray[dac_channel], pwm_duty);
	VirPwm_SetStatus(&VirPwmDefArray[dac_channel], dac_state);

	return 0;
}

/*
 * Operation of motor.
 * -e: enable
 * -b: brake
 * -r: reverse
 * -s: set speed (0~10000)
 * -d: decrease speed by step (0~10000)
 * -i: increase speed by step (0~10000)
 */
int shellCmd_Opt_Motor(uint32_t argc, const char *argv[])
{
	return 0;
}

/*
 * Operation of heater.
 * -e: enable (0,1)
 * -p: power (0~10000)
 */
int shellCmd_Opt_Heater(uint32_t argc,  const char *argv[])
{
	return 0;
}

/*
 * Set parameter of PID.
 * -p: proportion
 * -i: integral
 * -d: differential
 * -s: set value
 */
int shellCmd_Opt_PID(uint32_t argc,  const char *argv[])
{
//	int opt = 0;
//	optind = 0;
//	optarg = 0;
//	opterr = 0;
//	optopt = 0;
//	while ((opt = getopt((int)argc,(char * const *) argv, (const char *) "p:i:d:s:")) != -1)
//	{
//		switch (opt)
//		{
//		case 'p':
//			PID_InitStruct.kp = atof(optarg);
//			break;
//		case 'i':
//			PID_InitStruct.ki = atof(optarg);
//			break;
//		case 'd':
//			PID_InitStruct.kd = atof(optarg);
//			break;
//		case 's':
//			PID_InitStruct.sv = atof(optarg);
//			break;
//		default:
//			return -1;
//		}
//	}
	return 0;
}

/*
 For hex string, high byte is in front of low byte.
 */
int shellCmd_SysData_GetValue_ByHexString(uint32_t argc,  const char *argv[])
{
//	uint16_t* pointer = 0;
//	char* hexStr;
//	uint8_t* bit8DataArray;
//	uint8_t pos;
//	uint8_t dataLen;
////	int16_t data;
//	char strTemp[50];
//	if (argc < 4)
//	{
//		return -1;
//	}
//	argv++;
//	if (strcmp((const char *) *argv, (const char *) "eeprom") == 0)
//	{
//		//pointer = EEPROM_Data;
//	}
//	else if (strcmp((const char *) *argv,(const char *) "sensor") == 0)
//	{
//		//pointer=Sensor_Data;
//	}
//	else
//	{
//		return -1;
//	}
//	argv++;
//	pos = (uint8_t) atoi((const char *) *argv);
//	pointer += pos;
//
//	argv++;
//	dataLen = (uint8_t) atoi((const char *) *argv);
//
//	hexStr = malloc(4 * dataLen * sizeof(char) + 1);
//	bit8DataArray = malloc(2 * dataLen * sizeof(char));
//	memset(hexStr, 0, 4 * dataLen * sizeof(char) + 1);
//	memset(bit8DataArray, 0, 2 * dataLen * sizeof(char));
//
//	if ((hexStr == 0) | (bit8DataArray == 0))
//		return -1;
//
//	//    memcpy(bit8DataArray,pointer,2*dataLen*sizeof(char));/*浼氭湁澶у皬绔棶棰�*/
//	//Little Endian to store 16bit data.
//	for (int i = 0; i < dataLen; i++)
//	{
//		bit8DataArray[2 * i] = (pointer[i] >> 8) & 0xFF;
//		bit8DataArray[2 * i + 1] = pointer[i] & 0xFF;
//	}
//
//	ByteArrayToHexStr((const uint8_t *)bit8DataArray, hexStr, dataLen * 2);
//	sprintf(strTemp,(const char *) "SysData:%s@%d~%d:%s.", *(argv - 2), pos, dataLen, hexStr);
//	shellDisplay(strTemp);
//	free(hexStr);
//	free(bit8DataArray);
	return 0;
}

/*
 For hex string, high byte is in front of low byte.
 */
int shellCmd_SysData_SetValue_ByHexString(uint32_t argc,  const char *argv[])
{
//	uint16_t *pointer = 0;
////	char* hexStr;
//	uint8_t* bit8DataArray;
//	uint8_t pos;
//	uint8_t dataLen;
////	uint16_t data;
//	if (argc < 5)
//	{
//		return -1;
//	}
//	argv++;
//
//	if (strcmp((const char *) *argv,(const char *) "eeprom") == 0)
//	{
//		//pointer = EEPROM_Data;
//	}
//	else
//	{
//		return -1;
//	}
//	argv++;
//	pos = (uint8_t) atoi((const char *)*argv);
//	pointer += pos;
//	//pos= atof(*argv);
//	argv++;
//	dataLen = (uint8_t) atoi((const char *)*argv);
//
//	bit8DataArray = malloc(2 * dataLen * sizeof(char));
//	if (bit8DataArray == 0)
//		return -1;
//	argv++;
//	HexStrToByteArray((const char *) *argv, bit8DataArray, dataLen * 4);
//
//	//Little Endian to store 16bit data.
//	for (int i = 0; i < dataLen; i++)
//	{
//		pointer[i] = (pointer[i] & 0x00FF) | (bit8DataArray[2 * i] << 8);
//		pointer[i] = (pointer[i] & 0xFF00) | (bit8DataArray[2 * i + 1]);
//	}
	return 0;
}
#endif
